#!/bin/perl
#
# Libreria de Interfaz de usuario para comando reporte
#
require "./manejoDatos.pl";

sub darBienvenida(){
	print "Bienvenido al sistema de consultas. TP SSOO - 2°2010 - Grupo 2\n";
}

sub mostrarMenu(){
	print "#######################################################################\n";
	print "Elija una opcion ingresando su numero, y presione ENTER para continuar:\n";
	print "#######################################################################\n";
	print "#      1- Facturas A PAGAR/LIBERADAS por rango de fechas              #\n";
	print "#      2- Facturas A PAGAR/LIBERADAS por rango de montos              #\n";
	print "#      3- Listado de disponibilidad    				      #\n";
	print "#      4- Ayuda			    				      #\n";
	print "#      5- Salir                        				      #\n";	
	print "#######################################################################\n";	
}

sub mostrarAyuda(){
	print "\nAYUDA: DESCRIPCION DETALLADA DE LOS COMANDOS.\n";
	print "\nEste sistema permite visualizar listados que permitan conocer numeros del negocio.\n";
	print "Opciones del sistema:\n";
	print "1 - Es una consulta donde se filtran las facturas por rango de fechas y opcionalmente por estado.\n";
	print "    Al ingresar las fechas desde y hasta, se valida que las mismas sean del formato correcto: aaaa-mm-dd.\n";
	print "    Se solicitara seleccionar si desea filtar por estado o ver todos los estados.\n";
	print "    Se solicitara seleccionar si desea ver subtotales diarios, semanales, mensuales, total, todos o ninguno.\n";
	print "    Se solicitara seleccionar la salida del resultado de la consulta.\n";
	print "    Si se selecciona algunas de las opciones que guardan en archivo, se solicitara el nombre de dicho archivo.\n";
	print "    Se validara que el nombre ingresado tenga solo caracteres alfanuméricos.\n";
	print "    Si ya existe un archivo con ese nombre sera pisado.\n";
	print "    \n";
	print "2 - Es una consulta donde se filtran las facturas por rango de montos y opcionalmente por estado.\n";
	print "    Al ingresar los montos desde y hasta, se valida que los mismos sean del formato correcto: N enteros y dos decimales.\n";
	print "    Se solicitara seleccionar si desea filtar por estado o ver todos los estados.\n";
	print "    Se solicitara seleccionar si desea ver subtotales diarios, semanales, mensuales, total, todos o ninguno.\n";
	print "    Se solicitara seleccionar la salida del resultado de la consulta.\n";
	print "    Si se selecciona algunas de las opciones que guardan en archivo, se solicitara el nombre de dicho archivo.\n";
	print "    Se validara que el nombre ingresado tenga solo caracteres alfanuméricos.\n";
	print "    Si ya existe un archivo con ese nombre sera pisado.\n";
	print "3 - Consulta donde se listan todas las disponibilidades.\n";
	print "    \n";
	print "4 - Muestra este menu\n";
	print "5 - Sale de la aplicacion\n";
	print "\n";
	print "\n";
}

#Muestra los resultados para las consultas por rango de fechas y rango de montos.
sub mostrarResultadosConsulta(){
	my ($opcionSalida,$nombreArchivoSalida, %resultados) = @_;
	$tamanio_hash = keys %resultados;	
	if($tamanio_hash == 0){
	
	}
	else{
		my $separador = ' | ';
		my $salida = "";
		$salida .= "\n\n LISTADO DE RESULTADOS PARA LA CONSULTA INGRESADA:\n\n";
		$salida.= "FORMATO RESULTADO:\n"."Numero Factura". $separador ."Estado Factura". $separador ."Fecha Factura".$separador.
			  "Monto a pagar".$separador."Semana"."\n";
		
		foreach $clave ( sort keys %resultados){
			my @valores = split(";",$resultados{$clave});
			$salida.= $valores[0]."\t";
			$salida.= $valores[1]."\t";
			$salida.= $valores[2]."\t";
			$salida.= $valores[3]."\t"."\n";

		}
	
		if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
			guardarListado($nombreArchivoSalida,$salida);	
		}
		if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
			print $salida;
		}
		return $salida;	
	}
				

}

sub mostrarResultadosConsultaDisponibilidad(){
	my ($opcionSalida,$nombreArchivoSalida, %resultados) = @_;

	my $separador = ' | ';
	my $salida = "";
	$salida .= "\n\n LISTADO DE RESULTADOS PARA LA CONSULTA INGRESADA:\n\n";
	$salida.= "FORMATO RESULTADO:\n"."Fuente". $separador ."Monto Disponible". $separador ."Fecha ultima modificacion".$separador.
		  "Usuario ultima modificacion"."\n";
	
	foreach $clave ( sort keys %resultados){
		my @valores = split(";",$resultados{$clave});
	
		$salida.= &AgregarEspacio($valores[0], length(" Fuente")) ;
		$salida.= &AgregarEspacio($valores[1], length(" Monto Disponible"));
		$salida.= &AgregarEspacio($valores[2], length(" Fecha ultima modificacion "));
		$salida.= &AgregarEspacio($valores[3], length(" Usuario ultima modificacion"))."\n";
	}

	if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
		guardarListado($nombreArchivoSalida,$salida);	
	}
	if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
		print $salida;
	}
	return $salida;	
			

}

sub mostrarSubtotalDiario(){
	my ($opcionSalida,$nombreArchivoSalida,%resultados) = @_;
	my $salida = "";
	$salida .= "\n\n TOTALES DIARIOS:\n\n";
	
	foreach $clave ( sort keys %resultados){
		$salida.= " Dia: ".$clave;		
		$salida.= " Monto: ".$resultados{$clave}."\n";
	}
	if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
		agregarGuardarAListado($nombreArchivoSalida,$salida);	
	}
	if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
		print $salida;
	}
		
	return $salida;
}

sub mostrarSubtotalSemanal(){
	my ($opcionSalida,$nombreArchivoSalida,%resultados) = @_;
	my $salida = "";
	$salida .= "\n\n TOTALES SEMANALES:\n\n";
	
	foreach $clave ( sort keys %resultados){
		$salida.= " Semana: ".$clave;		
		$salida.= " Monto: ".$resultados{$clave}."\n";
	}
	if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
		agregarGuardarAListado($nombreArchivoSalida,$salida);	
	}
	if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
		print $salida;
	}
		
	return $salida;
}

sub mostrarSubtotalMensual(){
	my ($opcionSalida,$nombreArchivoSalida,%resultados) = @_;
	my $salida = "";
	$salida .= "\n\n TOTALES MENSUALES:\n\n";
	
	foreach $clave ( sort keys %resultados){
		$salida.= " Mes: ".$clave;		
		$salida.= " Monto: ".$resultados{$clave}."\n";
	}
	if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
		agregarGuardarAListado($nombreArchivoSalida,$salida);	
	}
	if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
		print $salida;
	}
		
	return $salida;
}

sub mostrarTotalFinal(){
	my ($opcionSalida,$nombreArchivoSalida,$monto) = @_;
	my $salida = "";
	$salida .= "\n\n TOTAL FINAL: $monto \n";
	
	if(($opcionSalida eq "a") || ($opcionSalida eq "ap")){
		agregarGuardarAListado($nombreArchivoSalida,$salida);	
	}
	if(($opcionSalida eq "p") || ($opcionSalida eq "ap")){
		print $salida;
	}
		
	return $salida;
}


#Agrega espacios a un string para centrarlo
sub AgregarEspacio() {
	
	my($ed1, $max_size)=@_;
	if( $maxsize <= length($ed1)){
		$Return = $ed1;
	}
	
	$izq=$max_size-length($ed1);
	$der=$izq;

	$izq=$izq/2;
	$der=$der/2;

	$izq= int $izq;
	$der= int ($der + 0.5);

	for($i=0; $i<$izq;$i++){
		$ed1=" ".$ed1;
	}

	for($i=0; $i<$der;$i++){
		$ed1=$ed1." ";
	}

	$Return = $ed1;
}

sub informarComandoErroneo(){
	print "La opcion ingresada es erronea. Vuelva a intentar.\n";
}

sub pedirFechaDesde(){
	my $valido = 0;
	my $fechaDesde;
	while($valido == 0){ 
		print "Ingrese fecha desde: ";
		$fechaDesde = <STDIN>;
		chomp($fechaDesde);
		$res = validarFecha($fechaDesde);
		if ($res == 1) {
	    		print "El formato de la fecha debe ser del tipo aaaa-mm-dd \n";
		}
		else{
			$valido = 1;		
		}
	}
	return $fechaDesde;
}

sub pedirFechaHasta(){
	my $valido = 0;
	my $fechaHasta;
	while($valido == 0){ 
		print "Ingrese fecha hasta: ";
		$fechaHasta = <STDIN>;
		chomp($fechaHasta);
		$res = validarFecha($fechaHasta);
		if ($res == 1) {
	    		print "El formato de la fecha debe ser del tipo aaaa-mm-dd \n";
		}
		else{
			$valido = 1;		
		}
	}
	return $fechaHasta;

}

sub pedirMontoDesde(){
	my $valido = 0;
	my $monto;
	while($valido == 0){ 
		print "Ingrese monto desde: ";
		$monto = <STDIN>;
		chomp($monto);
		$res = validarMonto($monto);
		if ($res == 1) {
	    		print "El monto ingresado es inválido. El monto debe ser de N enteros y 2 dígitos decimales.\n";
		}
		else{
			$valido = 1;		
		}
	}
	return $monto;	
}

sub pedirMontoHasta(){
	my $valido = 0;
	my $monto;
	while($valido == 0){ 
		print "Ingrese monto hasta: ";
		$monto = <STDIN>;
		chomp($monto);
		$res = validarMonto($monto);
		if ($res == 1) {
	    		print "El monto ingresado es inválido. El monto debe ser de N enteros y 2 dígitos decimales.\n";
		}
		else{
			$valido = 1;		
		}
	}
	return $monto;	
}

sub pedirOpcionSalida(){
	my $salidaElegida = ""; 
	my $opcionValida = 0;
	my @asalida;	
	while ($opcionValida == 0){
			
		my $salida = "Seleccione la opcion de salida: \n";
		$salida.="a : Salida por archivo. \n";
		$salida.="p : Salida por pantalla. \n";
		$salida.="ap: Salida por archivo y pantalla. \n";
		print $salida;	
		$salidaElegida = <STDIN>;
		chomp($salidaElegida);	
		if($salidaElegida eq "a" || $salidaElegida eq "p" || $salidaElegida eq "ap"){
			$asalida[0] = $salidaElegida;	
			$opcionValida = 1;
			if($salidaElegida eq "a" || $salidaElegida eq "ap"){
			my $valido = 0;
			my $nombreArchivoElegido;
			while($valido == 0){ 
			print "Ingrese el nombre del archivo: ";
				$nombreArchivoElegido = <STDIN>;
				chomp($nombreArchivoElegido);
				$res = validarNombreArchivo($nombreArchivoElegido);
				if ($res == 1) {
			    		print "Nombre ingresado invalido. Debe contener solo caracteres alfa numericos.\n";
				}
				else{
					$valido = 1;		
				}
			}
			$asalida[1] = $nombreArchivoElegido;	

		}			
			
			
		}
		else{
			informarComandoErroneo();
			
		}
	}
	
	
	return @asalida;
}

sub pedirOpcionSubtotales(){
	my $salidaElegida = "";
	my $opcionValida = 0;	
	while ($opcionValida == 0){
		my $salida ="Desea ver Totales: \n";
		$salida.="d : Diarios. \n";
		$salida.="s : Semanal. \n";
		$salida.="m : Mensual. \n";
		$salida.="f : Final. \n";
		$salida.="t : Todos. \n";
		$salida.="n : Sin subtotales. \n";
		print $salida;	
		$salidaElegida = <STDIN>;
		chomp($salidaElegida);	
		if($salidaElegida eq "d" || $salidaElegida eq "s" || $salidaElegida eq "m" || $salidaElegida eq "f" 
		|| $salidaElegida eq "t" || $salidaElegida eq "n"){
			$opcionValida = 1;			
		}
		else{
			informarComandoErroneo();
			
		}
	}
	return $salidaElegida;
}

sub pedirOpcionEstado(){
	my $opcionValida = 0;
	my $estadoElegido = "";	
	while ($opcionValida == 0){
		my $salida = "Seleccione estado de facturas: \n";
		$salida.="a : A PAGAR. \n";
		$salida.="l : LIBERADA. \n";
		$salida.="t : TODOS. \n";
		print $salida;	
		$estadoElegido = <STDIN>;
		chomp($estadoElegido);	
		if($estadoElegido eq "a" || $estadoElegido  eq "l" || $estadoElegido  eq "t"){
			$opcionValida = 1;
			
		}
		else{
			informarComandoErroneo();
			
		}
	}
	
	my $descripcionEstado = "";	
	if ($estadoElegido eq "a"){
		$descripcionEstado = "A PAGAR";	
	}

	if ($estadoElegido eq "l"){
		$descripcionEstado = "LIBERADA";	
	}

	if ($estadoElegido eq "t"){
		$descripcionEstado = "TODOS";	
	}
	
	return $descripcionEstado;
}


1;#necesario
